5 公共函数

平台内置的公共函数默认挂载在bigdata项目下 其他项目要使用的话要加上bigdata.的前缀

5.1 json 函数

5.1.1 json_extract_value

说明 从json字符串数据中,获取key值,可以一次获取多个key的值返回 如果获取多个字段,优先json_extract_value函数,不要使用hive 自带的get_json_object,get_json_object每调用一次,需要解析一次,重复解析影响性能

bigdata.json_extract_value(jsondata, key1, ..., keyn) as (col1, ..., coln)

实例

select bigdata.json_extract_value('{"name":"hongyi.zhou","address":"hangzhou"}', "name", "address") as (name, address);
--output
name        address
hongyi.zhou hangzhou

--解析json数组
select bigdata.json_extract_value('[{"name":"hongyi.zhou"}, {"address":"hangzhou"}, {"address2":"hangzhou2"}]', "/0/name", "/1/address", "/2/address2") as (name, address, address2);
--output
name        address     address2
hongyi.zhou hangzhou    hangzhou2

5.1.2 json_extract_array_value

说明 从json字符串数据中,获取key值,可以一次获取多个key的值返回,类似json_extract_value,用于解析json 数组格式字符串,返回值类型为数组。

bigdata.json_extract_array_value(jsondata, key1, ..., keyn) as (col1, ..., coln)

实例

select bigdata.json_extract_array_value('[{"a": {"c": "val12"}}, {"a": {"c": "val2"}}]', "a/c") as (name);
--output
name
["val12","val2"]

5.1.3 explode_json_array

说明 从json字符串数组中获取key值,可以一次获取多个key的值返回,类似explode函数,数组值转为多行返回。

bigdata.explode_json_array(jsondata, key1, ..., keyn) as (col1, ..., coln)

实例

select bigdata.explode_json_array('[{"name":"hongyi.zhou", "address":{"name": "hangzhou"}}]', "name", "address/name") as (name, address);
--output
name        address
hongyi.zhou hangzhou

select bigdata.explode_json_array('[{"name":"hongyi.zhou", "address":"hangzhou"},{"name":"jian.tang", "address":"hangzhou"}]', "name", "address") as (name, address);
--output
name        address
hongyi.zhou hangzhou
jian.tang   hangzhou

5.1.4 to_json

说明 数据转为JSON 字符串,支持数据类型:map,list,struct,array,基本类型(string, int, bigint等),第二参数定义key 缩写名称,有一些key名称比较长,为了减少存储大小,提高计算效率有帮助, 可以缺省不填写

bigdata.to_json(data, key所有字名称格式:key=simplekey,...)

实例

--map转json
select bigdata.to_json(map("k1", "v1", "k2", "212"));
--output
{"k1":"v1","k2":"212"}

--array转json
select bigdata.to_json(array("e1", "e2", "e3"));
--output
["e1","e2","e3"]

todo 更复杂的后续补充。。

5.1.5 reduce_json

说明 reduce_json 与 to_json 比较类似,也是把复杂数据类型转为json 字符串,但支持抽取部分字段,例如map 字段很多,但计算只需要部分字段,只需要部分字段,通过第二参数定义抽取字段。也可以对字段名和类型进行转换,具体参考实例。

bigdata.reduce_json(data, key所有字名称格式:key=simplekey[:number],...)

实例

select bigdata.reduce_json(map("k1", "hongyi.zhou", "k2", "hangzhou", "k3", "male"), 'k1=name,k2=address:number')
--output
{"name":"hongyi.zhou","address":hangzhou}

5.1.6 json_compress

说明 json元素连接字符串。去掉json 中key,使用特定字符拼接json中key对应值,默认拼接符为 ~~, 如果为json array,每个item拼接字符为 ;,

bigdata.json_compress(json)
bigdata.json_compress(json, fields)
bigdata.json_compress(json, recordSplitChars, fieldSplitChars)
bigdata.json_compress(json, fields, recordSplitChars, fieldSplitChars)

实例

select bigdata.json_compress('[{"name":"zhangsan", "age": 18, "address": "hangzhou"}, {"name":"wangwu", "age": 17, "address": "hangzhou"}]')
--output
hangzhou~~zhangsan~~18;hangzhou~~wangwu~~17

--添加过滤列
select bigdata.json_compress('[{"name":"zhangsan", "age": 18, "address": "hangzhou"}, {"name":"wangwu", "age": 17, "address": "hangzhou"}]','name,address')
--output
zhangsan~~hangzhou;wangwu~~hangzhou

--自定义分割符
select bigdata.json_compress('[{"name":"zhangsan", "age": 18, "address": "hangzhou"}, {"name":"wangwu", "age": 17, "address": "hangzhou"}]',',','-')
--output
hangzhou-zhangsan-18,hangzhou-wangwu-17


--添加过滤列以及自定义分隔符
select bigdata.json_compress('[{"name":"zhangsan", "age": 18, "address": "hangzhou"}, {"name":"wangwu", "age": 17, "address": "hangzhou"}]','name,address',',','-')
--output
zhangsan-hangzhou,wangwu-hangzhou

5.1.7 json_split

说明 字符串分割后转json。 字符串json 数组格式,split 返回数组类型

bigdata.json_split(jsonStr)

实例

select json_split('[{"name":"test"}, {"name":"test1"}]');

5.2 字符串函数

5.2.1 encode_sha512

说明 sha_512算法加密文本数据,加密结果为字节数组,base64编码为字符串返回

bigdata.encode_sha512(加密数据, 加密salt)

实例

select bigdata.encode_sha512("hello", "salt");
--output
acc3054d59588aeff201e46474f717f84cf925e71123acb5ac83bd1b002c4345c266330d86e79e1dba142e51abfcde0bec4b363d39664d883f08c33584ede7ba

5.2.2 get_idcard_info

说明 解析身份证ID,获取省份、城市、县、年龄、性别、出生日期、出生年、出生月、出生日,校验idcard 无效,返回null

bigdata.get_idcard_info(idcard, key1, key2, ...)

在线校验身份证有效:https://shenfen.supfree.net/search.asp?id=430304197802031322

实例

-- 省份、城市、县、年龄、性别、出生日期、出生年、出生月、出生日、身份证是否合法 对应key为:
-- province、city、county、age、gender、birthdate、year、month、day、valid
-- 对应数据类型:string, string, string, int, string, date, int, int, int  
select bigdata.get_idcard_info('330225199002240354', 'province', 'year', 'gender', 'valid') as (province, birthdate, gender, valid);
--output
province    birthdate   gender  valid
浙江          1990        男

5.2.3 get_ip_info

说明 ip 地理位置信息,函数初始化时把所有IP信息全部加载到内存, 需要一点时间,批量计算非常快,IP库信息每天从afraudtech.elfin_geoip_zip表中更新一次

 bigdata.get_ip_info(ip, key1, key2, ...)

实例

-- 对应key为:country, province, city, isp, latitude, longitude
select bigdata.get_ip_info('221.123.137.11', 'country', 'province', 'city', 'isp', 'latitude', 'longitude')
as (country, province, city, isp, latitude, longitude)

5.2.4 md5_hash

说明 求字符串的md5

bigdata.md5_hash(str, encoding)

实例

select bigdata.md5_hash("目标字符串");
--output
97a8d00a8e4662000c3e0e45755f4d2e
--添加编码
select bigdata.md5_hash("目标字符串","utf-8");
--output
1d08ca7b42897730e6ea6e18f6b280e1

5.2.5 user_agent_parser

说明 解析浏览User Agent, 获取browser, browserType, browserVersion, os, osVersion, deviceType, kernel, kernelVersion, netWork, mobile信息

bigdata.user_agent_parser(userAgent, key1, key2, ...)

实例

-- 对应key为:browser, browserType, browserVersion, os, osVersion, deviceType, kernel, kernelVersion, netWork, mobile

select user_agent_parser('Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.110 Safari/537.36', 'browser', 'browserType', 'browserVersion', 'os', 'osVersion', 'deviceType', 'kernel', 'kernelVersion', 'netWork', 'mobile')
    as (browser, browserType, browserVersion, os, osVersion, deviceType, kernel, kernelVersion, netWork, mobile)

5.2.6 regexp_extract_all

说明 找出所有在字符串中匹配的模式

bigdata.regexp_extract_all(haystack, pattern, [index])

实例

select bigdata.regexp_extract_all("vwerasddger", "asd");
--output
asd

5.3 时间函数

5.3.1 dateformat

说明 时间格式转换

dateformat(时间字符串, 当前时间格式, 转换后时间格式)
dateformat(时间戳, 转换后时间格式)

实例

select dateformat('20170513', 'yyyyMMdd', 'yyyy-MM-dd');
--output
2017-05-13

--时间戳
select platformtool.dateformat(1496827831004, 'yyyy-MM-dd HH:mm:ss') from test_users_dt
--output
2017-06-07 17:30:31

5.4 数字函数

5.4.1 random_int

说明 生成整数随机数

bigdata.random_int()
bigdata.random_int(maxValue) #生成[0-maxValue)区间的的随机数

实例

select random_int();
select random_int(10);

5.5 数组函数

5.5.1 array_concat

说明 连接多个数组,返回一个数组

bigdata.array_concat(array1,array2,...)

实例

select bigdata.array_concat(array(1,2,3), array(1,2,3));
--output
[1,2,3,1,2,3]

5.5.2 array_contains

说明 判断元素是否存在于数组中

bigdata.array_contains(array,element)

实例

select array_contains(array(1,2,3), 4);
--false

select array_contains(array(1,2,3), 1);
--output
true

5.5.3 array_distinct

说明 数组去重

bigdata.array_distinct(array)

实例

select bigdata.array_distinct(array(1,2,3,3));
--output
[1,2,3]

5.5.4 array_element_at

说明 取得数组下标元素。正向从0开始,反向从-1开始,若不存在返回空

bigdata.array_distinct(array,index)

实例

--数组下标返回元素,支持正向(0开始)和反向(-1开始),元素不存在返回空
select bigdata.array_element_at(array(1,2,3), -1);
--output
3

select bigdata.array_element_at(array(1,2,3), 0);
--output
0

5.5.5 array_equals

说明 数组相等比较,只有长度相同且每个下标元素值相同才返回true,否则返回false

bigdata.array_equals(array1,array2)

实例

select bigdata.array_equals(array(1,2,3), array(1,2,3));
select
--output
true

bigdata.array_equals(array(1,2,3,4), array(1,2,3));
--output
false

select bigdata.array_equals(array(3,2,1), array(1,2,3));
--output
false

5.5.6 array_from_json

说明 json数组字符串转换为array,若非数组将报错

bigdata.array_from_json(json)

实例

select bigdata.array_from_json('[1, 2, 3]');
--output
['1','2','3']

5.5.7 array_intersect

说明 两个数组取交集,若交集不存在返回空数组

bigdata.array_intersect(array1,array2)

实例

select bigdata.array_intersect(array(1,2,3), array(1,2,4,7,3));
--output
[1,2,3]

select bigdata.array_intersect(array(1,2,3), array(8));
--output
[]

5.5.8 array_join

说明 将数组合成一个字符串,支持对null元素的替换。

bigdata.array_join(array,delimiter)
bigdata.array_join(array,delimiter,null_replacement)

实例

select bigdata.array_join(array(1,2,3,4), '-');
--output
1-2-3-4

--对null元素替换
select bigdata.array_join(array(1,2,null,4), '-', 'x');
--output
1-2-x-4

5.5.9 array_max

返回数组中最大元素值 说明

bigdata.array_max(array)

实例

select bigdata.array_max(array(1,2,3,4));
--output
4

5.5.10 array_min

返回数组中最小元素值 说明

bigdata.array_min(array)

实例

select bigdata.array_min(array(1,2,3,4));
--output
1

5.5.11 array_position

说明 获取元素在数组中的位置,注:从1开始计算。若不存在,返回0

bigdata.array_position(array,element)

实例

select bigdata.array_position(array(0,1,2,3,4), 3);
--output
4

select bigdata.array_position(array(0,1,2,3,4), -1);
--output
0

5.5.12 array_remove

数组删除元素后并返回,若不存在则返回原始数组。 说明

bigdata.array_remove(array,element)

实例

select bigdata.array_remove(array(1,2,3,4,3), 3);
--output
[1,2,4]

--不存在删除元素,返回原始数组
select bigdata.array_remove(array(1,2,3,4), -1);
--output
[1,2,3,4]

5.5.13 array_reverse

说明 数组逆序输出

bigdata.array_reverse(array)

实例

select bigdata.array_reverse(array(1,2,3,4));
--output
[4,3,2,1]

5.5.14 array_slice

说明 数组切片,start从0开始,支持逆向遍历。

bigdata.array_slice(array,start,length)

实例

select bigdata.array_slice(array(1,2,3,4,5,6,7), 1, 3);
--output
[2,3,4]

--逆向遍历
select bigdata.array_slice(array(1,2,3,4,5,6,7), -3, 2);
--outpupt
[5,6]

5.5.15 array_sort

说明 数组正向排序并输出

bigdata.sort(array)

实例

select bigdata.array_sort(array(7,1,8,3,4));
-output
[1,3,4,7,8]

5.5.16 array_value_count

说明 返回数组中某元素值个数。

bigdata.array_value_count(array,element)

实例

select bigdata.array_value_count(array(1,2,2,4), 2);
--output
2

5.5.17 merge_list

说明 合并多个数组,返回二维数组,与merge_set区别是相同的元素不会去重

bigdata.merge_list(array1,array2,...,arrayn)

实例

select bigdata.merge_list(array(array(1,2),array(2,3),array(2,3)));
--output
[[1,2],[2,3],[2,3]]

5.5.18 merge_set

说明 合并多个数组,返回二维数组,与merge_list区别是相同的元素去重

bigdata.merge_set(array1,array2,...,arrayn)
--output
[[1,2],[2,3]]

实例

select bigdata.merge_set(array(array(1,2),array(2,3),array(2,3)));

5.6 数据脱敏函数

5.6.1 mask

说明 数据脱敏方法。

bigdata.mask(value, upperChar, lowerChar, digitChar, otherChar, numberChar, dayValue, monthValue, yearValue)

实例

select mask("abcd-EFGH-8765-4321", "U", "s", "*");
--output
ssss-UUUU-****-****

5.6.2 mask_first_n

说明 前n个字符脱敏

bigdata.mask_first_n(value, charCount, upperChar, lowerChar, digitChar, otherChar, numberChar)

实例

select mask_first_n("1234-5678-8765-4321", 4);
--output
nnnn-5678-8765-4321

5.6.3 mask_last_n

说明 后n个字符脱敏

bigdata.mask_last_n(value, charCount, upperChar, lowerChar, digitChar, otherChar, numberChar)

实例

select mask_last_n("1234-5678-8765-4321", 4);
--output
1234-5678-8765-nnnn

5.6.4 mask_show_first_n

说明 除了前n个字符,剩下的全脱敏

bigdata.mask_show_first_n(value, charCount, upperChar, lowerChar, digitChar, otherChar, numberChar)

实例

select mask_show_first_n("1234-5678-8765-4321", 4);
--output
1234-nnnn-nnnn-nnnn

5.6.5 mask_show_last_n

说明 除了后n个字符,剩下的全脱敏

bigdata.mask_show_last_n(value, charCount, upperChar, lowerChar, digitChar, otherChar, numberChar)

实例

select mask_show_last_n("1234-5678-8765-4321", 4);
--output
nnnn-nnnn-nnnn-4321

5.6.6 mask_hash

说明 将输入转换成随机长度的字符串,当传入的不是字符串返回空

bigdata.mask_hash(value)

实例

select mask_hash('asdasf');
--output
c094f455d7c10c26ce5ef76e166c42391beaec917629a1236ed334da41006d0d

5.7 加解密函数

5.7.1 decode_base64

说明 base64解密

bigdata.decode_base64(str);

实例

select decode_base64('YXNkYXM=');
--output
asdas

5.7.2 des_gen_key

说明 des生成key。全套des加解密需要配合des_gen_key,des_encrypt和des_decrypt一起使用,且同一个key只能加解密同一份数据。

bigdata.des_gen_key();

实例

select des_gen_key();
--output
a/Qsnn9dlHw=

5.7.3 des_encrypt

说明 des加密。全套des加解密需要配合des_gen_key,des_encrypt和des_decrypt一起使用,且同一个key只能加解密同一份数据。

bigdata.des_encrypt(str,deskey)

实例

select des_encrypt('dfgsdf','a/Qsnn9dlHw=');
--output
l2EsEoQxZDY=

5.7.4 des_decrypt

说明 des解密。全套des加解密需要配合des_gen_key,des_encrypt和des_decrypt一起使用,且同一个key只能加解密同一份数据。

bigdata.des_decrypt(str,deskey)

实例

select des_decrypt('l2EsEoQxZDY=','a/Qsnn9dlHw=');
--output
dfgsdf

5.8 地理位置函数

5.8.1 udf_sys_geo_distance

说明

udf_sys_geo_distance(longitude, latitude, point)
(1)作用:用作一个经纬度列和一个固定的坐标点的距离计算
(2)参数说明:第一个参数为经度列名称, 类型double                     
 第二个参数为纬度列名称, 类型double              
 第三个参数为固定坐标点的经纬度,格式=>”经度,维度”, =>”120.85979,30.011984”                       
 返回:返回一个数值,单位为米(M)

实例

--查询(longitude,latitude),(120.85979,30.011984)两点之间的距离
select bigdata.udf_sys_geo_distance(121.85979,32.011984, "120.85979,30.011984");
--output
241933.56454198112

5.8.2 udf_sys_geo_in_cycle

说明

udf_sys_geo_in_cycle(longitude, latitude, point, radius)
(1)作用:做基于地理位置的经纬度画圈
(2)参数说明:第一个参数为经度列名称, 类型double                        
     第二个参数为纬度列名称, 类型double                       
     第三个参数为圆圈中心点的位置,格式=>”经度,维度”, =>”120.85979,30.011984”                        
     第四个参数为圆圈的半径,单位米                        
    返回:返回一个boolean值(3)

实例

--判断点121.85979,32.011984 是否在”120.85979,30.011984”为中心点,半径为5km的圆圈内
select udf_sys_geo_in_cycle(121.85979,32.011984, "120.85979,30.011984", 5000);
--output
false

5.8.3 udf_sys_geo_in_rectangle

说明

udf_sys_geo_in_rectangle(longitude, latitude, pointA, pointB)
(1)作用:用于做基于地理位置的经纬度画矩形
(2)参数说明:第一个参数为经度列名称, 类型double                       
第二个参数为纬度列名称, 类型double                    
第三个参数为矩形的左下角坐标,格式=>”经度,维度”, =>”120.85979,30.011984”                        
第四个参数为矩形的右上角坐标,格式=>”经度,维度”, =>”120.88450,31.21011”                        
返回:返回一个boolean值

实例

--判断点121.85979,32.011984 是否在”120.85979,30.011984”和””120.88450,31.21011””为2个斜角构成的矩形内
select udf_sys_geo_in_rectangle(121.85979,32.011984, "120.85979,30.011984", "120.88450,31.21011");
--output
false

results matching ""

    No results matching ""